<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // function Parent(n,a,s){
      //     this.name=n;
      //     this.age=a;
      //     this.sex=s;
      // }

      // Parent.abc=123; //静态属性
      // Parent.fun=function(){//静态方法
      //     console.log('静态方法');
      // }

      // Parent.prototype.type='human';
      // Parent.prototype.skill=function(){
      //     console.log('hehe');
      // }

      // let obj1 = new Parent('ts',20,'男');
      // console.log(obj1.name);
      // obj1.skill();

      // // console.log(Parent.skill===obj1.Skill);

      // //静态属性和静态方法属于构造函数本身，而不是构造函数的实例。
      // //就是相当于obj1不具有abc跟fun()这两个静态方法根属性
      // console.log(obj1.abc);
      // console.log(obj1.fun);
      // //如果直接访问这个函数，是无法显示这静态方法跟属性，
      // //静态属性和静态方法可以通过构造函数名直接访问，但不能通过实例对象访问
      // console.log(Parent);
      // console.log(Parent.abc);
      // console.log(obj1);

      // ES6的写法
      class Parent {
        //父类
        constructor(n, a, s) {
          //构造器
          this.name = n;
          this.age = a;
          this.sex = s;
          this.type = "human";
        }
        skill() {
          //当写在coustructor外面的函数都像于写在Parent这个原型上
          // 但是实例对象的属性不能写在constructor外面
          console.log("写代码");
        }
        static fun() {
          //用static声明的 相当于这个函数的静态方法
          console.log("静态方法");
        }
        static abc = 123; //静态属性
      }
      console.log(Parent.fun()); //构造函数本身是可以访问自己的静态方法
      console.log(Parent.abc);

      let obj1 = new Parent("Tans", 20, "男");
      console.log(obj1);
      console.log(obj1.type);
      //构造函数的实例对象没有继承构造函数的静态方法跟属性
      console.log(obj1.abc); //放回的undefiend
      console.log(obj1.fun);
      obj1.skill();

      //extends 表示的是 继承 相当于Child 继承 Parent
      class Child extends Parent {
        constructor(h, n, a, s) {
          super(n, a, s); //在子类函数中使用this指向之前，必须先调super方法，否则会报错
          this.hobby = h;
          super.skill();
        }
      }

      let obj2 = new Child("玩儿。。。", "tabs", 99, "nv");
      console.log(obj2);
      console.log(obj2.name);
      console.log(Child.skill);
      obj2.skill();
    </script>
  </body>
</html>
